トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Problem27 二次式素数
問題
オイラーは以下の二次式を考案している:
nの2乗 + n + 41
この式は, nを0から39までの連続する整数としたときに40個の素数を生成する.
しかし, n = 40 のとき 40の2乗 + 40 + 41 = 40(40 + 1) + 41 となり41で割り切れる.
また, n = 41 のときは 41の2乗 + 41 + 41 であり明らかに41で割り切れる.
コンピューターを用いて, 二次式 nの2乗 - 79n + 1601 という式が発見できた.
これは n = 0 から 79 の連続する整数で80個の素数を生成する.
係数の積は, -79 × 1601 で -126479である.
さて, |a| < 1000, |b| < 1000 として以下の二次式を考える
(ここで |a| は絶対値): 例えば |11| = 11 , |-4| = 4である.
nの2乗 + a*n + b
n = 0 から始めて連続する整数で素数を生成したときに
最長の長さとなる上の二次式の, 係数 a, b の積を答えよ.
ソース
using System;
class Program
{
static void Main()
{
Predicate<int> IsSosuu = (pVal) =>
{
if (pVal <= 1) return false; //1以下なら素数ではない
for (int I = 2; I * I <= pVal; I++) {
if (pVal % I == 0) return false;
}
return true;
};
int MaxLength = 0;
for (int a = -999; a <= 999; a++) {
for (int b = 2; b <= 999; b++) {
for (int n = 0; n < int.MaxValue; n++) {
if (IsSosuu(n * n + n * a + b) == false) break;
if (MaxLength < n + 1) {
MaxLength = n + 1;
Console.WriteLine("a={0},b={1}の時に{2}個の素数を生成し、係数a,bの積={3}",
a, b, MaxLength, a * b);
}
}
}
}
}
}
実行結果
省略
a=-61,b=971の時に60個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に61個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に62個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に63個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に64個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に65個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に66個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に67個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に68個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に69個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に70個の素数を生成し、係数a,bの積=-59231
a=-61,b=971の時に71個の素数を生成し、係数a,bの積=-59231
解説
nの2乗 + a*n + b
がn=0の時に素数になるのは、bが素数の場合なので、bは2以上となります。
上記をbの定義域とした上で、
aとbの全ての組み合わせで、
nを0からループさせてチェックしてます。